#!/usr/bin/env python

import utiles
import servers
import MySQLdb
import MySQLdb.cursors
from decimal import Decimal
import sys
import os


host=servers.host
user=servers.user
passwd=servers.passwd
db_name=servers.db_name

miBD=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name)
miCursor=miBD.cursor()
miBDDict=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name, cursorclass=MySQLdb.cursors.DictCursor)
miCursorDict=miBDDict.cursor()


def ordenCruda(consultaSQL):
    miCursor.execute(consultaSQL)
    auxiliar = miCursor.fetchall()
    return auxiliar

def ordenCrudaDict(consultaSQL, previo="SELECT 1"):
    miCursorDict.execute(previo)
    miCursorDict.execute(consultaSQL)
    auxiliar = miCursorDict.fetchall()    
    return auxiliar

def espacios(nrofactura,rellenar):
    aux = ""
    nrofactura = str(nrofactura)
    for i in range(rellenar-len(nrofactura)):
        aux += " "
    return aux+nrofactura

def invertirFecha(fecha):
    fecha = str(fecha)
    return fecha[8:10]+"-"+fecha[5:7]+"-"+fecha[0:4]

# *****************************************************************************

def encabezamiento(idcliente,datosCliente,f):
    #Encabezamiento
    fechaActual = utiles.getfechatoday(None)
    nroSucursal = utiles.getSucursalActiva()

    nombre = datosCliente[0]['nombre']
    direccion = datosCliente[0]['direccion']
    localidad = datosCliente[0]['localidad']
    telefono = datosCliente[0]['telefono']

    linea = " "+"\n"
    linea = linea + "Fecha: "+str(fechaActual)+" "*54+"Sucursal: "+nroSucursal+"\n"
    linea = linea + "*"*80+"\n"
    linea = linea + idcliente+" "+nombre+"\n"
    linea = linea + " "*9+direccion+" "+localidad+" "+telefono+"\n"

    print linea
    f.write(linea)

# *****************************************************************************

def procesarFactura(idcliente,f):
    tabla = "ventas"
    campos = "*"
    consultaSQL = "SELECT %s FROM %s WHERE idcliente = '%s' ORDER BY fecha" % (campos,tabla,idcliente)
    datosFacturas = ordenCrudaDict(consultaSQL)

    if datosFacturas != ():
        for factura in datosFacturas:
            nrofactura = factura['nrofactura']
            
            fecha = factura['fecha']
            totalfactura = factura['totalfactura']
            sucursal = factura['sucursal']
            vendedora = factura['usuario']
            idventa = factura['idventa']
            
            tabla = "vendedoras"
            campos = "nombre"
            consultaSQL = "SELECT %s FROM %s WHERE idvendedora = '%s'" % (campos,tabla,vendedora)
            datosVendedoras = ordenCrudaDict(consultaSQL)
            nombreVendedora = datosVendedoras[0]['nombre']

            linea = "-"*80+"\n\n"
            linea = linea + "FACTURA : "+espacios(nrofactura,6)+"   Fecha  "+invertirFecha(fecha)+"    Suc: "+sucursal
            linea = linea + " $ "+espacios(totalfactura,10)+"       ("+nombreVendedora+")"+"\n\n"

            print linea
            f.write(linea)
            
            listaRecibos = procesarDirectos(idventa,f)
            listaRecibos = procesarCtasCtes(idventa,listaRecibos,f)
            
            #eliminando repetidos
            aux = set(listaRecibos)
            listaRecibos = aux
    
    else:
        linea = "\nEl cliente informado no tiene compras realizadas\n"
        print linea
        f.write(linea)

# *****************************************************************************

def procesarDirectos(idventa,f):
    listaRecibos = []
    tabla = "ventastienepagos"
    campos = "*"
    consultaSQL = "SELECT %s FROM %s WHERE idventa = '%s'" % (campos,tabla,idventa)
    datosPagos = ordenCrudaDict(consultaSQL)
    
    linea = "Pagos\n"
    print linea
    f.write(linea)

    if datosPagos != ():
        for pagos in datosPagos:
            nrorecibo = pagos['nrorecibo']
            fecha = pagos['fecha']
            idformapagos = pagos['idformapagos']
            cuotas = pagos['cuotas']
            monto = pagos['monto']
            descripcion = pagos['descrivalor']
    
            linea = espacios(descripcion[0:17],25)+" "+invertirFecha(fecha)+" Cuota "+str(cuotas)+"   $ "+espacios(monto,10)+"\n"

            print linea
            f.write(linea)
            
            listaRecibos.append(nrorecibo)

    return listaRecibos

# *****************************************************************************

def procesarCtasCtes(idventa,listaRecibos,f):
    tabla = "vtas_ctasctes"
    campos = "*"
    consultaSQL = "SELECT %s FROM %s WHERE idventa = '%s'" % (campos,tabla,idventa)
    datosCuotas = ordenCrudaDict(consultaSQL)

    if datosCuotas != ():
        for cuotas in datosCuotas:
            impago = " "
            cuota = cuotas['cuota']
            fecha = cuotas['vencimiento']
            descripcion = cuotas['descripcion']
            montocuota = cuotas['montocuota']
            montopagado = cuotas['montopagado']
            if montocuota != montopagado:
                impago = "*"
            
            linea = espacios(descripcion[0:17],25)+" "+invertirFecha(fecha)+" Cuota "+str(cuota)+"   $ "+espacios(montopagado,10)+impago+"\n"
            
            print linea
            f.write(linea)
            
            idrecargo = cuotas['idrecargo']
            if idrecargo != None:
                procesarRecargos(idrecargo,listaRecibos,f)
                
            #aqui se procesan los pagos realizados a la cuota y/o recargos
            nrofactura = cuotas['nrofactura']
            
            listaRecibos = procesarCtasCtesTienePagos(idventa,nrofactura,listaRecibos,f)

    return listaRecibos

# *****************************************************************************

def procesarRecargos(idrecargo,listaRecibos,f):
    tabla = "vtas_recargos"
    campos = "*"
    consultaSQL = "SELECT %s FROM %s WHERE idrecargo = '%s'" % (campos,tabla,idrecargo)
    datosRecargos = ordenCrudaDict(consultaSQL)

    if datosRecargos != ():
        for recargo in datosRecargos:
            impago = " "
            descripcion = recargo['descripcion']
            fecha = recargo['fecharecargo']
            monto = recargo['monto']
            montopagado = recargo['montopagado']
            idrecargo2 = recargo['idrecargo2']

            if monto != montopagado:
                impago = "*"
            print espacios(descripcion[0:17],25)+" ",invertirFecha(fecha),"RECARGO"," "*4,"$",espacios(monto,10),impago
            if idrecargo != None:
                listaRecibos = procesarRecargos(idrecargo2,listaRecibos,f)
    
    return listaRecibos

# *****************************************************************************

def procesarCtasCtesTienePagos(idventa,nrofactura,listaRecibos,f):
    tabla = "vtas_ctasctestienepagos"
    campos = "*"
    consultaSQL = "SELECT %s FROM %s WHERE idventa = '%s' and nrofactura = '%s' ORDER BY fecha" % (campos,tabla,idventa,nrofactura)
    datosCtasCtesTienePagos = ordenCrudaDict(consultaSQL)
    
    if datosCtasCtesTienePagos != ():
        for pagosCtaCte in datosCtasCtesTienePagos:
            pass

    return listaRecibos


# *****************************************************************************
# PROCESO PRINCIPAL

if __name__ == '__main__':

    if len(sys.argv) < 2:
        print "INTRODUZCA EL NUMERO DE CLIENTE COMPLETO"
        idcliente = raw_input("sucursal-numero: ")
        print
##        print "Debe introducir como argumento el numero de cliente"
##        sys.exit()
    else:
        idcliente = sys.argv[1]

    tabla = "cliente"
    campos = "nombre,direccion,localidad,telefono"
    consultaSQL = "SELECT %s FROM %s WHERE idcliente = '%s'" % (campos,tabla,idcliente)
    datosCliente = ordenCrudaDict(consultaSQL)

    if datosCliente != ():
        archivo = "informes\\"+str(idcliente)+".txt" 
        f = open(archivo,"w")
        encabezamiento(idcliente,datosCliente,f)
        procesarFactura(idcliente,f)
        
        f.close()
        os.system("taskkill /IM firefox.exe /F")
        os.system("firefox.bat "+archivo)
    else:
        print "El numero de cliente informado no existe"

    miCursor.close()
    miBD.close()
